#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <string.h>
/*Declaracao das variaveis globais usadas*/
int J_ORDER;
int J_ROW_TEST;
float J_ERROR;
int J_ITE_MAX;

/*Funcao: NewMatrixA
 Paraetros:
 float **matrixA - matrix original
 float *lineA - linha usada para o teste apos o metodo
 Saida:
 VOID
 A funcao salva a linha de teste da matrixA e divide os elementos pelo seu elemento da diagonal correspondente
*/
void newMatrixA(float **matrixA, float *lineA);

/*Funcao: newVectorB
 Parametros:
 float **matrixA
 float *vectorB
 float *vectorX
 float *rB
 Saida:
 VOID
 A funcao gera o novo vetorB, dividido pelo elemento de A, no qual é zerado ao fim da funcao. A copia do vetorB ao vetorX ocorre para dar inicio ao metodo 
 */
void newVectorB(float **matrixA, float *vectorB, float *vectorX, float *rB);

/*FUncao: updateX
  Parametros:
  float *vectorX
  float *vectorB
  Saida:
  VOID
  A funcao atualiza os vetores X e oldX que sao usados na funcao calculateXi e CalculateDiff
*/
void updateX(float *oldVectorX, float *vectorX);

/*FUncao: calculateXi
  Parametros:
  float *vectorX
  float **matrixA
  float *vectorB
  float *oldVector
  Saida:
  VOID
  A funcao atualiza os vetores X e oldX que sao usados na funcao calculateXi e CalculateDiff
*/
void calculateXi(float *vectorX, float **matrixA, float *vectorB, float *oldVector);


/*FUncao: calculateDiff
  Parametros:
  float *vectorDiff
  float *vectorX
  float *oldVector
  Saida:
  VOID
  Calcula a diferenca absoluta entre os vetores X de cada iteracao
*/
void calculateDiff(float *vectorDiff, float *vectorX, float *oldVector);

/*FUncao: getMaxValueFromDiff
  Parametros:
  float *vectorDiff
  Saida:
  float Max
  Retorna o maior elemento do vetorDiff
*/
float getMaxValueFromVector(float *vector);

/*FUncao: getMr
  Parametros:
  void
  Saida:
  float Mr -
  Retorna o maior elemento do vetorDiff
*/
float getMr();

/*FUncao: getResult
  Parametros:
  float *vectorDiff
  float *vectorX
  Saida:
  float result
  Produto escalar do vetor LineA e o VetorX
*/
float getResult(float *lineA, float *vectorX);

/*Funcao: Jacobi
 Parametros:
 float **matrixA
 float *vectorB
 float *lineA
 float *vectorX
 float *oldVectorX
 float *vectorDiff
 float *rB
 Saida:
 VOID
 Metodo de Jacobi, resolve o sistema de equacoes lineares proposto no arquivo de entrada
*/
void Jacobi(float **matrixA, float *vectorB, float *lineA, float *vectorX, float *oldVectorX, float *vectorDiff, float *rB);
